#ifndef GAMESTATEPROCESSOR_H
#define GAMESTATEPROCESSOR_H

#include <QObject>
#include <QThread>
#include <QQueue>
#include <QMutex>
#include <QWaitCondition>
#include <QJsonObject>
#include <QJsonArray>
#include <QPoint>
#include <QTimer>
#include <QDateTime>
#include <QSharedPointer>

// 前向声明
class IncrementalGameStateParser;

/**
 * @brief 渲染就绪的游戏数据结构
 */
struct RenderReadyGameData {
    QList<QPoint> snakeBody;        // 蛇身体位置
    QList<QPoint> foods;            // 食物位置
    int score = 0;                  // 分数
    int direction = 3;              // 方向
    bool alive = true;              // 存活状态
    QString playerId;               // 玩家ID
    qint64 timestamp = 0;           // 时间戳
    qint64 sequenceNumber = 0;      // 序列号（用于处理乱序消息）
    bool isValid = false;           // 数据是否有效

    // 游戏信息
    int alivePlayers = 0;           // 存活玩家数
    int totalPlayers = 0;           // 总玩家数
    int gameSpeed = 200;            // 游戏速度

    // 地图信息
    int mapWidth = 40;              // 地图宽度
    int mapHeight = 30;             // 地图高度
    bool enableWalls = true;        // 是否启用边界墙
    QList<QPoint> obstacles;        // 地图障碍物位置
};

/**
 * @brief 游戏状态处理线程
 * 专门负责解析服务器游戏状态，转换为渲染就绪的数据
 */
class GameStateProcessor : public QObject
{
    Q_OBJECT

public:
    explicit GameStateProcessor(QObject *parent = nullptr);
    ~GameStateProcessor();

    /**
     * @brief 启动处理线程
     */
    void start();

    /**
     * @brief 停止处理线程
     */
    void stop();

    /**
     * @brief 设置线程优先级
     */
    void setPriority(QThread::Priority priority);

    /**
     * @brief 添加游戏状态到处理队列
     * @param gameState 原始游戏状态JSON
     */
    void addGameState(const QJsonObject &gameState);

    /**
     * @brief 获取当前队列大小
     */
    int queueSize() const;

    /**
     * @brief 是否正在运行
     */
    bool isRunning() const { return m_running; }

    /**
     * @brief 启用/禁用增量解析
     * @param enabled 是否启用增量解析
     */
    void setIncrementalParsingEnabled(bool enabled);

    /**
     * @brief 获取解析统计信息
     */
    void getParseStats() const;

signals:
    /**
     * @brief 渲染就绪数据信号
     * @param data 处理好的渲染数据
     */
    void renderDataReady(const RenderReadyGameData &data);

    /**
     * @brief 游戏结束信号
     * @param reason 结束原因
     */
    void gameEnded(const QString &reason);

    /**
     * @brief 处理统计信号
     * @param processed 已处理数量
     * @param queued 队列中数量
     * @param processingTime 处理时间(ms)
     */
    void processingStats(int processed, int queued, int processingTime);

public slots:
    /**
     * @brief 处理游戏状态队列
     */
    void processQueue();

private:
    /**
     * @brief 解析单个游戏状态
     * @param gameState 原始游戏状态JSON
     * @return 渲染就绪数据
     */
    RenderReadyGameData parseGameState(const QJsonObject &gameState);

    /**
     * @brief 解析蛇数据
     * @param snakeData 蛇数据JSON
     * @return 蛇身体位置列表
     */
    QList<QPoint> parseSnakeBody(const QJsonObject &snakeData);

    /**
     * @brief 解析食物数据
     * @param foodsArray 食物数组JSON
     * @return 食物位置列表
     */
    QList<QPoint> parseFoods(const QJsonArray &foodsArray);

private:
    QThread *m_thread;                      // 工作线程
    QQueue<QJsonObject> m_gameStateQueue;  // 游戏状态队列
    mutable QMutex m_queueMutex;            // 队列互斥锁
    QWaitCondition m_queueCondition;        // 队列条件变量
    QTimer *m_processTimer;                 // 处理定时器

    bool m_running;                         // 是否运行中
    int m_processedCount;                   // 已处理数量
    qint64 m_lastProcessTime;               // 上次处理时间

    // 增量解析器
    IncrementalGameStateParser *m_incrementalParser;
    bool m_incrementalParsingEnabled;       // 是否启用增量解析

    static const int MAX_QUEUE_SIZE = 5;    // 最大队列大小
};

// 注册自定义类型到Qt元对象系统，支持跨线程传递
Q_DECLARE_METATYPE(RenderReadyGameData)

#endif // GAMESTATEPROCESSOR_H
